\chapter{Выбор технологий разработки}

После формулирования требований и разработки модели данных встаёт вопрос о выборе технологий разработки. Понятно, что нужно осуществить выбор СУБД, так как приложение будет нуждаться в источнике данных, а так же языка программирования и дополнительных средств разработки при необходимости. Ниже приведены соображения, по которым были выбраны те или иные технологии.

\section{Выбор СУБД}

Поскольку целью выполнения учебного задания является развитие определённых навыков, то использовать облегчённые версии СУБД вроде SQLite не имеет смысла. Вместо этого следует выбрать одну из распространённых в настоящее время полнофункциональных СУБД, предназначенную для промышленных разработок. Этим требованиям удовлетворяют по крайней мере следующие СУБД: Microsoft SQL Server, MySQL, Oracle Database, PostgreSQL.

Другие СУБД либо не предназначены для промышленного использования, либо устарели и используются только в старых проектах, в которых изменение СУБД менее рационально, чем поддержка уже используемой. Проведём сравнение этих СУБД по ряду параметров и сделаем выбор в пользу наилучшей. В таблице \ref{tab:dbms} приведён результат нашей работы.\cite{mssql}\cite{mysql}\cite{oracle}\cite{postgres}\cite{sqlcmp}

\begin{table}[!hbtp]
\caption{Сравнение СУБД}
\label{tab:dbms}
\scriptsize
%\hspace*{-5em}
\begin{tabular}{|p{0.16\textwidth}|p{0.2\textwidth}|p{0.2\textwidth}|p{0.2\textwidth}|p{0.2\textwidth}|}
\hline
Параметр & Microsoft SQL Server~2008~R2 & MySQL~5.5.8 & Oracle Database 11g Release~2 & PostgreSQL~9.0.4 \\
\hline
ACID & + & + & + & + \\
\hline
Unicode & + & + & + & + \\
\hline
Дата последнего релиза & 21.04.2010 & 15.12.2010 & ноябрь 2010 & 18.04.2011 \\
\hline
Кросплатфор-менность & Нет (только Windows) & Полная & Частичная (не поддерживает AmigaOS, Symbian и z/OS) & Частичная (не поддерживает AmigaOS, Symbian и z/OS) \\
\hline
Лицензия & Проприетарная & GPL или Проприетарная & Проприетарная & PostgreSQL licence (свободная и открытая) \\
\hline
Максимальный размер базы & 524258~ТБ & Нет ограничения & Нет ограничения & Нет ограничения \\
\hline
Нативные объекты (триггеры, процедуры, функции и~т.~д.) & Все & Не поддерживает домены & Все & Все \\
\hline
Поддержка индексов & Частичная (только на одной закрытой технологии) & Плохая (только R-деревья) & Хорошая (без полнотекстового поиска) & Полная \\
\hline
Секционирование & Только по диапазонам значений & Полная поддержка & Полная поддержка & Полная поддержка \\
\hline
Стандарт SQL & Заявлена полная поддержка SQL-92 & Заявлена частичная поддержка SQL:2003 & Заявлена частичная поддержка SQL:2008 & Заявлена частичная поддержка SQL:2003 \\
\hline
Таблицы и представления & Полная поддержка & Не поддерживает материализованные представления & Полная поддержка & Не поддерживает материализованные представления \\
\hline
\end{tabular}
\end{table}

Из таблицы \ref{tab:dbms} видно, что все СУБД не уступают друг другу, однако существенным преимуществом СУБД MySQL и PostgreSQL является наличие свободной лицензии, что позволяет использовать их как для обучения, так и для написания коммерческих проектов. Выбор между ними достаточно сложен: PostgreSQL в целом считается более полнофункциональной и поддерживает больше специфических инструментов, в то время как MySQL проще в использовании. При правильном применении можно получать сравнимые по быстродействию и эффективности работы приложения как с использованием СУБД MySQL, так и PostgreSQL.

Тем не менее, авторы остановились на PostgreSQL, поскольку он обладает по крайней мере следующими преимуществами:\cite{postgres}
\begin{enumerate}
\item Полностью свободная лицензия (в MySQL нужно использовать либо вирусную GPL, либо проприетарную лицензию).
\item Лучшая поддержка стандартов SQL.
\item Более быстрое индексирование.
\item Более качественный оптимизатор запросов.
\item Наличие большого количества различных инструментов для работы.
\end{enumerate}

Нужно отметить, что СУБД PostgreSQL используется такими проектами и компаниями, как:
\begin{itemize}
\item BASF
\item MySpace
\item OpenStreetMap
\item Skype
\item Sony Online Entertainment
\item Yahoo!
\end{itemize}

\section{Выбор архитектуры приложения}

Теперь отметим, что для нашей задаче рационально использовать веб-приложение, а не десктопное приложение. Веб-приложения работают в соответствии с технологией <<клиент-сервер>> и предоставляют интерфейс сразу большому количеству пользователей. Они обладают по крайней мере следующими преимуществами по сравнению с десктопными аналогами:\cite{web}
\begin{enumerate}
\item Нет проблем распространения, так как приложение запускается в одном месте и публикуется в интернете.
\item Пользователю не требуется устанавливать какое-либо специфическое ПО на своём копьютере, вместо этого для всех веб-приложений достаточно одного браузера. Как следствие, пользователю не нужно быть администратором компьютера, чтобы использовать веб-приложение.
\item Администрирование веб-приложений можно осуществлять удалённо, не привязываясь к местонахождению конкретного пользователя.
\item Обновление ПО происходит существенно проще, разработчику проще поддерживать ПО и исправлять ошибки, так как не нужно высылать пользователям никакие патчи.
\item Веб-приложение не занимает место на компьютере.
\item Веб-приложение кросплатформенно, то есть не привязано к операционной системе на копьютере пользователя.
\item В веб-приложении проще обеспечить любой заданный уровень безопасности, оно защищено от декомпиляции и прочих атак на десктопные приложения.
\end{enumerate}

Очевидно, использование архитектуры веб-приложения позволяет проще удовлетворить описанным выше требованиям к нашему приложению. Кроме того, в нашем случае веб-приложение позволяет частично снять нагрузку с сервера базы данных, упростить доступ к базе и лучше скрыть её наличие от пользователей.

\section{Выбор языка программирования}

Известно, что в веб-разработке используются преимущественно динамические языки программирования, такие как Perl, PHP, Python и Ruby. В меньшей стпени распространены Java и C\#, которые используются в основном для крупных промышленных приложений, у которых веб-интерфейс далеко не единственный. Преимуществами динамических языков в этом смысле являются следующие их особенности:\cite{dynamic}
\begin{enumerate}
\item Высокая скорость разработки.
\item Динамическая типизация позволяет использовать некоторые особые синтаксические конструкции, не доступные при статической типизации.
\item Простота поддержки, возможность переписывать код на лету, во время работы приложения.
\item Компактность исходного кода программ.
\end{enumerate}

На стороне клиента в браузере также не удастся обойтись без скриптовых эффектов. Здесь признанным лидером разработки является JavaScript, поскольку только его поддерживают все популярные браузеры. Тем не менее, следует стремиться, чтобы приложение нормально работало и при выключенном JavaScript.

Что касается выбора конкретного динамического языка программирования, то здесь следует иметь ввиду не только характеристики самого языка, но и (возможно, даже в большей степени) средства, предназначенные конкретно для создания веб-приложений на этом языке. Так Perl обычно используют непосредственно через CGI-скрипты веб-сервера, код на PHP встраивается в веб-страницы (хотя существует много различных фреймворков для PHP), самый популярный фреймворк для веб-разработки на Python~--- Django, а для Ruby~--- Ruby on Rails.

Нужно отметить, что Perl сам по себе является довольно сложным в плане синтаксиса языком. И хотя он позволяет писать достаточно гибкие синтаксические конструкции, они могут оказаться сложными для понимания. Код на Perl сложно читать и поддерживать. Этих недостатков, надо сказать, лишён Python. \cite{perl}

PHP также довольно проблемный язык, имеющий значительное количество недостатков, однако весьма популярной по причине простоты изучения и использования. Среди существенных недостатков можно отметить недостаточную поддержку многопоточности, проблемы с поддержкой Unicode, отсутствие пространств имён. PHP не подходит для написания сколько-нибудь масштабных проектов, в отличние от Python и Ruby.\cite{php}

Выбор между Python и Ruby довольно сложен, однако авторы остановились на Python, потому что он обладает по сравнению с Ruby следующими достоинствами:
\begin{enumerate}
\item Более высокая скорость работы.
\item Большая популярность в среде веб-разработчиков.
\item Поощрение написания понятного читаемого кода.
\item Широкий набор встроенных библиотек и сторонних фреймворков.
\item Простота освоения.
\end{enumerate}

Решающим фактором в выборе Python в качестве языка разработки послужил большой опыт работы с этим языком. Из фреймворков был использован Django, как наиболее популярный и также по причине наличия у авторов опыта разработки на нём. Из достоинств Django можно выделить следующие:\cite{django}
\begin{enumerate}
\item Встроенный ORM, допускающий, между тем, прямое выполнение SQL-запросов.
\item Автоматическая генерация административной части сайта.
\item Диспетчер URL на основе регулярных выражений.
\item Поддержка интернационализации и локализации.
\item Встроенная система аутентификации и авторизации.
\item Мощные средства работы с формами.
\item Гибкая библиотека шаблонов для генерации HTML-страниц.
\end{enumerate}
